package mysql8学习.高级.第15章_锁;

/**
 * ② 意向锁 (intention lock)
 * 在行锁添加一个x/s的锁的时候，会在上一级（表锁）添加一个意向x/s锁
 * 目的就是为了告诉表锁  我内部存在x/s的锁，不用一行一行遍历找是否有x/s的锁
 *
 * InnoDB支持多粒度锁(multiple granularity locking) ，
 * 它允许行级锁与表级锁共存，而意向锁就是其中的一种表锁。
 * 1、意向锁的存在是为了协调行锁和表锁的关系，支持多粒度(表锁与行锁)的锁并存。
 * 2、意向锁是一种不与行级锁冲突表级锁，这一点非常重要。
 * 3、表明 “某个事务正在某些行持有了锁或该事务准备去持有锁”
 * 意向锁分为两种:
 * ● 意向共享锁: 事务有意向对表中的某些行加共享锁(S锁)
 * ● 意向排他锁: 事务有意向对表中的某些行加排他锁(X锁)
 * 1.意向锁要解决的问题
 * 现在有两个事务，分别是T1和T2,其中T2试图在该表级别上应用共享或排它锁，
 * 如果没有意向锁存在，那么T2就需要去检查各个页或行是否存在锁;
 * 如果存在意向锁，那么此时就会受到由T1控制的表级别意向锁的阻塞。
 * T2在锁定该表前不必检查各个页或行锁，而只需检查表上的意向锁。
 * 简单来说就是给更大一级别的空间示意里面是否已经上过锁。
 *
 * 在数据表的场景中，如果我们给某一行数据加上了排它锁，数据库会自动给更大一级的空间，
 * 比如数据页或数据表加上意向锁，告诉其他人这个数据页或数据表已经有人上过排它锁了，
 * 这样当其他人想要获取数据表排它锁的时候，
 * 只需要了解是否有人已经获取了这个数据表的意向排他锁即可。
 * ● 如果事务想要获得数据表中某些记录的共享锁，就需要在数据表上添加意向共享锁。
 * ● 如果事务想要获得数据表中某些记录的排他锁，就需要在数据表上添加意向排他锁。
 *  这时，意向锁会告诉其他事务已经有人锁定了表中的某些记录。
 *
 * 从上面的案例可以得到如下结论:
 * 1. InnoDB 支持多粒度锁，特定场景下，行级锁可以与表级锁共存。
 * 2. 意向锁之间互不排斥，但除了IS与S(意向共享锁和共享锁)兼容外，
 *    意向锁会与共享锁/排他锁互斥。
 * 3. IX, IS是表级锁，不会和行级的X，S锁发生冲突。只会和表级的X，S发生冲突。
 * 4. 意向锁在保证并发性的前提下，实现了行锁和表锁共存且满足事务隔离性的要求。
 *
 */
public class C_B1_2_意向锁 {
}